#include <pthread.h>
#include <iostream>

using std::cout;
using std::endl;

//全局变量, 也是一个共享变量，临界资源
//在多线程环境之下，对于临界资源的访问必须要互斥进行
//一个线程访问完毕之后，另外一个线程才能再进行访问
//此时就必须要使用互斥锁了
int gnum = 0;
int flag = 1;
pthread_mutex_t mutex;
pthread_cond_t cond;

void * threadFunc1(void * arg)
{   //每一个线程都有自己单独的栈空间
    int  cnt = 10000;
    while(cnt-- > 0) {
        pthread_mutex_lock(&mutex);
        //1号线程 flag为0时，要等待
        while(flag == 0) {//将if改成while是为了防止异常唤醒
            //阻塞当前线程
            pthread_cond_wait(&cond, &mutex);
        }
        //1号线程， flag为1时，才执行加1操作
        gnum++;
        cout << "sub thread 1 " << gnum << endl;
        flag = 0;//还要修改flag的值
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond);//通知2号线程
    }
    return NULL;
}

void * threadFunc2(void * arg)
{
    int  cnt = 10000;
    while(cnt-- > 0) {
        pthread_mutex_lock(&mutex);
        //2号线程 flag为1时，要等待
        while(flag == 1) {
            pthread_cond_wait(&cond, &mutex);
        }
        //2号线程 flag为0，执行加1操作
        gnum++;
        cout << "sub thread 2 " << gnum << endl;
        flag = 1;
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond);//通知1号线程
    }

    return NULL;
}


int main()
{
    //初始化互斥锁
    pthread_mutex_init(&mutex, NULL);
    //初始化条件变量
    pthread_cond_init(&cond, NULL);

    pthread_t pthid1, pthid2;
    pthread_create(&pthid1, NULL, threadFunc1, NULL);
    pthread_create(&pthid2, NULL, threadFunc2, NULL);

    pthread_join(pthid1, NULL);
    pthread_join(pthid2, NULL);

    cout << "main thread gnum:" << gnum << endl;
    //互斥锁的销毁
    pthread_mutex_destroy(&mutex);

    return 0;
}

